1 : <?php
2 : /*--------------------------------------------------------------------------+
3 : This file is part of eStudy.
4 : courses/classes/class.Course.inc.php
5 : - Modulgruppe: Veranstaltungen
6 : - Beschreibung: Methoden zum Administrieren von Veranstaltungen.
7 : - Version: 0.4.1, 12/01/06
8 : - Autor(en): Timo Fuchs <timo.fuchs@mni.fh-giessen.de>
9 : Steffen Woersdoerfer <steffen.woersdoerfer@mni.fh-giessen.de>
10 : Steffen Eller <steffen.eller@mni.fh-giessen.de>
11 : +---------------------------------------------------------------------------+
12 : This program is free software; you can redistribute it and/or
13 : modify it under the terms of the GNU General Public License
14 : as published by the Free Software Foundation; either version 2
15 : of the License, or any later version.
16 : +---------------------------------------------------------------------------+
17 : This program is distributed in the hope that it will be useful,
18 : but WITHOUT ANY WARRANTY; without even the implied warranty of
19 : MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 : GNU General Public License for more details.
21 : You should have received a copy of the GNU General Public License
22 : along with this program; if not, write to the Free Software
23 : Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
24 : +--------------------------------------------------------------------------*/
25 :
26 :
27 : /**
28 : * In dieser Datei wird die Klasse Course implementiert.
29 : * @package eStudy.Courses
30 : * @version 0.4.1, 12/01/06
31 : * @author Timo Fuchs <timo.fuchs@mni.fh-giessen.de>
32 : * @author Steffen Woersdoerfer <steffen.woersdoerfer@mni.fh-giessen.de>
33 : * @author Steffen Eller <steffen.eller@mni.fh-giessen.de>
34 : */
35 :
36 :
37 : /** Teilnehmerobjekte*/
38 : require_once(PATH_TO_ROOT."courses/classes/class.participant.inc.php");
39 : /** Veranstaltungseinstellungen*/
40 : require_once(PATH_TO_ROOT."courses/classes/class.Settings.inc.php");
41 : /** Hilfsfunktionen zur Veranstaltungslogistik */
42 : require_once(PATH_TO_ROOT."courses/classes/class.CourseUtil.inc.php");
43 : /** estudy-Course */
44 : require_once(PATH_TO_ROOT."courses/classes/class.estudycourse.inc.php");
45 : /** User */
46 : require_once(PATH_TO_ROOT."user/classes/class.user.inc.php");
47 : /** Kurse aus XML-Import*/
48 : require_once (PATH_TO_ROOT."admin/classes/class.XmlImport.inc.php");
49 :
50 : /** Methodensammlung zum Anlegen und Loeschen von Veranstaltungen sowie Benutzerverwaltung innerhalb der Veranstaltungen.
51 : *
52 : * @package eStudy.Courses
53 : * @author Timo Fuchs <timo.fuchs@mni.fh-giessen.de>
54 : * @author Steffen Woersdoerfer <steffen.woersdoerfer@mni.fh-giessen.de>
55 : * @author Steffen Eller <steffen.eller@mni.fh-giessen.de>
56 : * @version 0.5, 12/01/06
57 : */
58 : class Course {
59 :
60 : /**
61 : * Standard-Konstruktor.
62 : * @access public
63 : * @return void
64 : */
65 0 : function Course() {}
66 :
67 : public static function changeToEcom($courseID, $newModerator) {
68 0 : global $db, $EZSQL_ERROR;
69 :
70 0 : $courseID = (int)$courseID;
71 0 : $errorCount = count($EZSQL_ERROR);
72 0 : $moderator = (int)$newModerator;
73 :
74 0 : $sql = "UPDATE courses SET Type = 'ecom' WHERE ID = '$courseID'";
75 0 : $db->query($sql);
76 :
77 0 : $sql = "SELECT ID FROM coursetree WHERE parentID = 0 AND courseID = 0 AND type = 'node_ecom'";
78 0 : $ecomFolder = (int)$db->get_var($sql);
79 :
80 0 : $sql = "UPDATE coursetree ";
81 0 : $sql .= "SET type = 'leaf_ecom',";
82 0 : $sql .= " parentID = '$ecomFolder'";
83 0 : $sql .= " WHERE courseID = '$courseID'";
84 0 : $db->query($sql);
85 :
86 0 : $sql = "INSERT INTO ecommunities (courseID, daysOfInactivity, warningSent, moderator_userID, verifyCode) ";
87 0 : $sql .= "VALUES ('$courseID', '', '', '$moderator', '')";
88 0 : $db->query($sql);
89 :
90 0 : return count($EZSQL_ERROR) <= $errorCount;
91 : }
92 :
93 : /**
94 : * Legt eine Veranstaltung in der Datenbank an.
95 : * Hierbei werden nur die Pflichtfelder (ID, Name, Semester, DozentID)
96 : * mit Werten gefuellt.
97 : *
98 : * @access protected
99 : * @static
100 : * @param string $name - Name der Veranstaltung
101 : * @param string $shortName - Kurzname der Veranstaltung
102 : * @param string $modulShortCut - Modulkürzel der Veranstaltung
103 : * @param integer $dozentID - ID des Dozenten
104 : * @param integer $mni - Gibt an, ob sich um eine MNI-Veranstaltung handelt
105 : * @return integer - ID der angelegten Veranstaltung
106 : * string - Fehlerbeschreibung, falls Veranstaltung nicht erzeugt werden konnte
107 : */
108 : function createCourse($name, $shortName, $modulShortCut, $dozentID, $mni=false) {
109 0 : global $db, $EZSQL_ERROR;
110 :
111 : // OpenDate wird auf aktuellen Tag gesetzt, CloseDate auf 90 Tage später
112 0 : $openDate = date("Y-m-d", time());
113 0 : $closeDate = date("Y-m-d", time()+90*24*3600);
114 :
115 : // Default-Wert fuer eingebundene Modulgruppen festlegen.
116 0 : $modules = 0;
117 0 : $boundInMods = $db->get_results("SELECT ID FROM modulegroups WHERE Choosable=0");
118 0 : if(is_array($boundInMods) && (count($boundInMods) > 0)) {
119 0 : foreach($boundInMods as $mod) {
120 0 : $modules = $modules | (int)pow(2, (int)$mod->ID - 2);
121 0 : }
122 0 : }
123 :
124 : // Default-Wert fuer AssRights setzen.
125 0 : $assMods = 0;
126 :
127 : // Default-Wert fuer maximale Teilnehmerzahl setzen.
128 0 : $maxStudents = 200;
129 :
130 : // Veranstaltungsnamen ueberpruefen und formatieren.
131 0 : $nameError = Settings::validateName($name);
132 0 : if($nameError != "") {
133 0 : return "Veranstaltung konnte nicht angelegt werden:<br />Fehlerhafter Veranstaltungsname (".$nameError.")";
134 : }
135 0 : $name = Settings::formatName($name);
136 :
137 : // Kurznamen ueberpruefen und formatieren.
138 0 : $shortNameError = Settings::validateShortname($shortName);
139 0 : if($shortNameError != "") {
140 0 : return "Veranstaltung konnte nicht angelegt werden:<br />Fehlerhafter Kurzname (".$shortNameError.")";
141 : }
142 0 : $shortName = Settings::formatName($shortName);
143 :
144 0 : if (empty($dozentID)) {
145 0 : return "Veranstaltung konnte nicht angelegt werden:<br />Kein Dozent angegeben.";
146 : }
147 :
148 0 : if (empty($modulShortCut)) {
149 0 : return "Veranstaltung konnte nicht angelegt werden:<br />Kein Modulkürzel angegeben.";
150 : }
151 :
152 : //Falls es sich um einen MNI-Kurs handelt
153 0 : if ($mni){
154 : // Falls das Modulkuerzel schon in einem offenen Kurs verwendet wird
155 : // !Geaendert: Der shortname ist nun frei editierbar vom Kursersteller
156 : /* if (EStudyCourse::is_mSC_used_in_open_course($modulShortCut)){
157 : //Dozentenkuerzel ermitteln
158 : $dozent = new User($dozentID);
159 : $dozent->getUserData();
160 : $shortName = $modulShortCut."_".$dozent->userData['shortname'];
161 : }
162 : else
163 : $shortName = $modulShortCut; */
164 :
165 : //Eintragen der Modulkuerzel-ID als Fremdschluessel
166 0 : $mSC_ID = XmlImport::get_latest_ID_by_MSC($modulShortCut);
167 0 : }
168 :
169 :
170 0 : if ( isset($_POST['semester']) ) {
171 0 : $semesterColumn = ", Semester";
172 0 : $semesterValue = ", '".self::semesterStringToDB($_POST['semester'])."'";
173 0 : } else {
174 0 : $semesterColumn = $semesterValue = "";
175 : }
176 :
177 : // pruefen, ob Veranstaltung schon existiert.
178 : //$courseExists = $db->get_var("SELECT ID FROM courses WHERE Name='".$name."' AND Semester='".$semester."' ");
179 : //if($courseExists) {
180 : // return "Veranstaltung existiert bereits";
181 : //}
182 :
183 : // ----- Insert-Anfrage konstruieren fuer Datenbanktabelle course und ausfuehren-----
184 :
185 0 : $createCourse = "INSERT INTO courses (";
186 0 : $createCourse .= "Name, ";
187 0 : $createCourse .= "ShortName, ";
188 0 : $createCourse .= "modulShortCut, ";
189 0 : $createCourse .= "OpenDate, ";
190 0 : $createCourse .= "CloseDate, ";
191 0 : $createCourse .= "Modules, ";
192 0 : $createCourse .= "AssRights, ";
193 0 : $createCourse .= "MaxStudents,";
194 0 : $createCourse .= "Type ";
195 0 : $createCourse .= $semesterColumn.",";
196 0 : $createCourse .= "modulbeschreibung_ID";
197 0 : $createCourse .= ") ";
198 0 : $createCourse .= "VALUES (";
199 0 : $createCourse .= "'".$name."', ";
200 0 : $createCourse .= "'".$shortName."', ";
201 0 : $createCourse .= "'".$modulShortCut."', ";
202 0 : $createCourse .= "'".$openDate."', ";
203 0 : $createCourse .= "'".$closeDate."', ";
204 0 : $createCourse .= "'".$modules."', ";
205 0 : $createCourse .= "'".$assMods."', ";
206 0 : $createCourse .= "'".$maxStudents."', ";
207 0 : $createCourse .= "'course'";
208 0 : $createCourse .= $semesterValue.",";
209 : /* Bei einem MNI-Kurs wird die ID von der aktuellen Modulbeschreibung als Fremdschluessel gespeichert.
210 : Ansonsten wird "-1" in die DB eingetragen. */
211 : if($mni)
212 0 : $createCourse .= "'".$mSC_ID."'";
213 : else
214 0 : $createCourse .= "'-1'";
215 0 : $createCourse .= ")";
216 :
217 0 : $errorCount = count($EZSQL_ERROR);
218 0 : $db->query($createCourse);
219 0 : $nid = $db->insert_id;
220 0 : if(count($EZSQL_ERROR) > $errorCount) {
221 0 : return "Fehler beim Eintrag in die Datenbank.";
222 : }
223 :
224 : //----Automation-------------------------------------------------------
225 : /**zum Ausführen automatischer Funktionen*/
226 0 : require_once(PATH_TO_ROOT."common/classes/class.automation.inc.php");
227 :
228 : //neues objekt erstellen und standard logfile benutzen
229 0 : $autoCreate = new Automation("");
230 0 : $autoCreate->newCourse($nid);
231 : //---------------------------------------------------------------------
232 :
233 0 : $errorCount = count($EZSQL_ERROR);
234 0 : $db->query("INSERT INTO user_course (userID, courseID, regtime) VALUES ('".$dozentID."', '".$nid."', ".time().")");
235 0 : if(count($EZSQL_ERROR) > $errorCount) {
236 0 : return "Veranstaltung konnte nicht angelegt werden:<br />Fehler beim Eintrag in die Datenbank";
237 : }
238 :
239 : //----Automation-------------------------------------------------------
240 : /**zum Ausführen automatischer Funktionen*/
241 0 : require_once(PATH_TO_ROOT."common/classes/class.automation.inc.php");
242 :
243 : //neues objekt erstellen und standart logfile benutzen
244 0 : $autoAddUser = new Automation("");
245 0 : $autoAddUser->addUserToCourse($dozentID, $nid);
246 : //---------------------------------------------------------------------
247 :
248 0 : return (int)$nid;
249 : }
250 :
251 :
252 : /**
253 : * Loescht eine Veranstaltung.
254 : * Es werden alle zu der Veranstaltung gehoerigen Daten aus den Tabellen
255 : * 'courses' , 'user_course' und 'assistents' geloescht.
256 : *
257 : * @access protected
258 : * @static
259 : * @param integer $courseid - ID der Veranstaltung, die geloescht werden soll
260 : * @return bool true - wenn alle zur Veranstaltung gespeicherten Daten geloescht wurden
261 : * false - wenn Fehler auftrat
262 : */
263 : function deleteCourse($courseid) {
264 0 : global $db, $EZSQL_ERROR;
265 :
266 : //----Automation-------------------------------------------------------
267 : /**zum Ausführen automatischer Funktionen*/
268 0 : require_once(PATH_TO_ROOT."common/classes/class.automation.inc.php");
269 :
270 : //neues objekt erstellen und standart logfile benutzen
271 0 : $autoDelete = new Automation("");
272 0 : $autoDelete->deleteCourse($courseid);
273 : //---------------------------------------------------------------------
274 :
275 0 : $errorCount = count($EZSQL_ERROR);
276 0 : $db->query("DELETE FROM assistents WHERE courseID=".$courseid);
277 0 : if (count($EZSQL_ERROR) > $errorCount) {
278 0 : return false;
279 : }
280 :
281 0 : $errorCount = count($EZSQL_ERROR);
282 0 : $db->query("DELETE FROM user_course WHERE courseID=".$courseid);
283 0 : if (count($EZSQL_ERROR) > $errorCount) {
284 0 : return false;
285 : }
286 :
287 0 : $errorCount = count($EZSQL_ERROR);
288 0 : $db->query("DELETE FROM courses WHERE ID=".$courseid);
289 0 : if (count($EZSQL_ERROR) > $errorCount) {
290 0 : return false;
291 : }
292 :
293 0 : $errorCount = count($EZSQL_ERROR);
294 0 : $db->query("DELETE FROM coursetree WHERE courseID=".$courseid);
295 0 : if (count($EZSQL_ERROR) > $errorCount) {
296 0 : return false;
297 : }
298 :
299 0 : return true;
300 : }
301 :
302 : /**
303 : * Archiviert eine Veranstaltung.
304 : * Teilnehmerliste erstellen und unter Ressourcen ablegen.
305 : * Letzte Mitteilung generieren und per Mail verschicken.
306 : * Alle Teilnehmer außer Dozenten und Tutoren ausschließen.
307 : * Kurs schließen.
308 : *
309 : * @author Clemens Weiß <clemens.weiss@mni.fh-giessen.de>
310 : * @access protected
311 : * @static
312 : * @param integer $courseID - ID der Veranstaltung
313 : * @return bool Erfolgswert
314 : */
315 : function archiveCourse($courseID) {
316 0 : global $db, $settings;
317 0 : $courseID = intval($courseID);
318 0 : if ($courseID <= 0 || $db->get_var("SELECT closed FROM courses WHERE ID='$courseID'"))
319 0 : return false;
320 0 : $userID = $_SESSION["userid"];
321 0 : $courseName = $db->get_var("SELECT ShortName FROM courses WHERE ID=$courseID");
322 :
323 : // Teilnehmerlisten erstellen und speichern
324 0 : require_once(PATH_TO_ROOT."user/classes/class.UserlistExportDialog2.inc.php");
325 : // Verzeichnis erstellen, wenn noch nicht vorhanden
326 0 : $dir = PATH_TO_ROOT.$settings["upload_path"]."filemanager/courseID/$courseID/";
327 0 : if (!is_dir($dir)) Utilities::mkdir_r($dir);
328 : // Hauptordner "Kurs-Archiv <Datum Uhrzeit>" in Ressourcen erstellen
329 0 : $db->query("INSERT INTO filelist (link, parent_object, userID, create_time, courseID, type, visible_type, student_write) "
330 0 : ."VALUES ('Kurs-Archiv ".date("Y-m-d H:i", time())."', 0, $userID, ".time().", $courseID, 'folder', 1, 0)");
331 0 : $folderID = $db->insert_id;
332 0 : $ul = new UserlistExportDialog2(false, $courseID);
333 0 : $_POST[$ul->membergroupsFormName] = array(6, 7, 8); // Dozenten, Tutoren, Studenten
334 0 : for ($i = 1; $i <= 18; $i++)
335 0 : $_POST[$ul->outputfieldsFormName][] = $i; // zu speichernde Felder
336 0 : $semester = Course::semesterDBtoString($db->get_var("SELECT Semester FROM courses WHERE ID=$courseID"));
337 : // HTML-Export
338 0 : $file = $_SESSION['userid'].time().$courseID."1";
339 0 : if ($f = @fopen($dir.$file, "w")) {
340 0 : if (!fwrite($f, $ul->export(UL_FORMAT_HTML)))
341 0 : return false;
342 0 : fclose($f);
343 0 : } else return false;
344 0 : $db->query("INSERT INTO filelist "
345 : ."(name, link, orig_filename, extension, parent_object, userID, size, create_time, courseID, type, visible_type, student_write) VALUES "
346 0 : ."('Mitgliederliste $semester HTML', '$file', 'Mitgliederliste.html', 'html', $folderID, $userID, ".filesize($dir.$file).", ".time().", $courseID, 'file', 1, 0)");
347 : // CSV-Export
348 0 : $_POST[$ul->csvColDelimFormName] = ",";
349 0 : $_POST[$ul->csvRowDelimFormName] = "\n";
350 0 : $file = $_SESSION['userid'].time().$_SESSION['course']."2";
351 0 : if ($f = @fopen($dir.$file, "w")) {
352 0 : if (!fwrite($f, $ul->export(UL_FORMAT_CSV)))
353 0 : return false;
354 0 : fclose($f);
355 0 : } else return false;
356 0 : $db->query("INSERT INTO filelist "
357 : ."(name, link, orig_filename, extension, parent_object, userID, size, create_time, courseID, type, visible_type, student_write) VALUES "
358 0 : ."('Mitgliederliste $semester CSV', '$file', 'Mitgliederliste.csv', 'csv', $folderID, $userID, ".filesize($dir.$file).", ".time().", $courseID, 'file', 1, 0)");
359 0 : unset($_POST[$ul->outputfieldsFormName]);
360 0 : unset($_POST[$ul->membergroupsFormName]);
361 0 : unset($_POST[$ul->csvRowDelimFormName]);
362 0 : unset($_POST[$ul->csvColDelimFormName]);
363 :
364 : //----Automation-------------------------------------------------------
365 : /**zum Ausführen automatischer Funktionen*/
366 0 : require_once(PATH_TO_ROOT."common/classes/class.automation.inc.php");
367 :
368 : // neues Objekt erstellen und Standard-Logfile benutzen
369 0 : $auto = new Automation("");
370 0 : $auto->archiveCourse($courseID);
371 : //---------------------------------------------------------------------
372 :
373 : // Studenten ausschließen
374 0 : $users = Course::getParticipants($courseID, "student");
375 0 : foreach ($users as $user) {
376 0 : Course::removeParticipant($user->userid, $courseID);
377 0 : }
378 :
379 : // Kurs schließen
380 0 : $db->query("UPDATE courses SET closed=1 WHERE ID=$courseID");
381 0 : return true;
382 : }
383 :
384 : /**
385 : * Reaktiviert eine archivierte Veranstaltung.
386 : * Kurs wieder öffnen.
387 : * Anmeldezeitraum auf 90 Tage ab jetzt einstellen.
388 : * Aktuelles Semester eintragen.
389 : *
390 : * @author Clemens Weiß <clemens.weiss@mni.fh-giessen.de>
391 : * @access protected
392 : * @static
393 : * @param integer $courseID - ID der Veranstaltung
394 : * @return bool Erfolgswert
395 : */
396 : function reactivateCourse($courseID) {
397 0 : global $db;
398 0 : if (!$db->get_var("SELECT closed FROM courses WHERE ID=$courseID"))
399 0 : return false;
400 :
401 : //----Automation-------------------------------------------------------
402 : /**zum Ausführen automatischer Funktionen*/
403 0 : require_once(PATH_TO_ROOT."common/classes/class.automation.inc.php");
404 :
405 : // neues Objekt erstellen und Standard-Logfile benutzen
406 0 : $auto = new Automation("");
407 0 : $auto->reactivateCourse($courseID);
408 : //---------------------------------------------------------------------
409 :
410 0 : $db->query("UPDATE courses "
411 : ."SET closed=0, "
412 0 : ."OpenDate='".date("Y-m-d", time())."', "
413 0 : ."CloseDate='".date("Y-m-d", time()+90*24*3600)."', "
414 0 : ."Semester='".CourseUtil::getCurrentSemester()."' "
415 0 : ."WHERE ID=$courseID");
416 : // die geänderten Werte müssen aus dem POST-Array entfernt werden, damit das Formular aktuell ist
417 0 : unset($_POST["semester"]);
418 0 : unset($_POST["openDate_day"]);
419 0 : unset($_POST["openDate_month"]);
420 0 : unset($_POST["openDate_year"]);
421 0 : unset($_POST["closeDate_day"]);
422 0 : unset($_POST["closeDate_month"]);
423 0 : unset($_POST["closeDate_year"]);
424 0 : return true;
425 : }
426 :
427 : /**
428 : * Fuegt einen Benutzer einer Veranstaltung hinzu.
429 : * @access protected
430 : * @static
431 : * @param integer $userid - ID des Benutzers
432 : * @param integer $courseid - ID der Veranstaltung
433 : * @param integer $differentUsergroup - Benutzergruppe, die der hinzugefügte User im Kurs einnehmen soll, 0 für die Gruppe, mit der er registriert ist
434 : * @return bool - true, wenn Benutzer zu Veranstaltung hinzugefuegt
435 : * - false, wenn Benutzer schon Teilnehmer ist oder Datenbankfehler auftrat
436 : */
437 : function addParticipant($userid, $courseid, $differentUsergroup = 0) {
438 0 : global $db, $EZSQL_ERROR;
439 :
440 0 : $diffUsergroup = $db->get_var("SELECT differentUsergroup FROM user_course WHERE userID=$userid AND courseID=$courseid");
441 0 : if ($diffUsergroup === null) {
442 0 : $insertQ = "INSERT INTO user_course (userID, courseID, regtime, differentUsergroup) ";
443 0 : $insertQ .= "VALUES (".$userid." , ".$courseid.", ".time().", $differentUsergroup)";
444 0 : } elseif ($diffUsergroup !== $differentUsergroup) {
445 0 : $insertQ = "UPDATE user_course SET differentUsergroup=$differentUsergroup WHERE userID=$userid AND courseID=$courseid";
446 0 : } else {
447 0 : return false;
448 : }
449 :
450 0 : $errorCount = count($EZSQL_ERROR);
451 0 : $db->query($insertQ);
452 :
453 0 : if(count($EZSQL_ERROR) > $errorCount) {
454 0 : return false;
455 : }
456 : //----Automation-------------------------------------------------------
457 0 : if ($diffUsergroup === null) {
458 : /**zum Ausführen automatischer Funktionen*/
459 0 : require_once(PATH_TO_ROOT."common/classes/class.automation.inc.php");
460 :
461 : // neues Objekt erstellen und Standard-Logfile benutzen
462 0 : $autoAddUser = new Automation("");
463 0 : $autoAddUser->addUserToCourse($userid, $courseid);
464 0 : } else {
465 : /**zum Ausführen automatischer Funktionen*/
466 0 : require_once(PATH_TO_ROOT."common/classes/class.automation.inc.php");
467 :
468 : // neues Objekt erstellen und Standard-Logfile benutzen
469 0 : $autoAddUser = new Automation("");
470 0 : $autoAddUser->changeUserGroupInCourse($userid, $courseid, $diffUsergroup, $differentUsergroup);
471 : }
472 : //---------------------------------------------------------------------
473 :
474 0 : return true;
475 : }
476 :
477 : /**
478 : * Liefert die zu einer Veranstaltung gehoerenden Teilnehmer.
479 : *
480 : * @access public
481 : * @static
482 : * @param integer $courseid - Id der Veranstaltung, deren Teilnehmer ermittelt werden sollen
483 : * @param string $roles - Filter fuer die Auswahl der Veranstaltungsteilnehmer
484 : * moegliche Werte sind :
485 : * 'teacher' - es werden nur die Dozenten der Veranst ausgew
486 : * 'assistent' - nur Tutoren
487 : * 'student' - nur Studenten
488 : * 'wait' - Benutzer, die auf der Warteliste fuer die
489 : * Veranstaltung stehen, aber noch keine
490 : * Teilnehmer sind.
491 : * 'all' - Zusammenfassung von 'teacher' , 'assistent'
492 : * und 'student'
493 : * @param string $orderBy - DB-Tabellenspalte nach der sortiert werden soll.
494 : * Default-Wert ist "user.Nachname".
495 : * @param string $orderDir - Richtung, in die sortiert werden soll.
496 : * Default-Wert ist "DESC".
497 : * @returns mixed integer 0 - falls Fehler auftrat (z.B. keine Teilnehmer vorhanden )
498 : * object[] - Array mit Teilnehmerobjekten, die wie folgt aufgebaut sind:
499 : * $participant->userid // Userid des Teilnehmers
500 : * $participant->shortname // Kurzname des Teilnehmers
501 : * $participant->firstname // Vorname des Teilnehmers
502 : * $participant->lastname // Nachname des Teilnehmers
503 : * $participant->email // Email-Adresse des Teilnehmers
504 : */
505 : function getParticipants($courseid, $roles = "all", $orderBy = "user.Nachname", $orderDir = "ASC") {
506 0 : global $db;
507 :
508 : switch($roles) {
509 0 : case "teacher" :
510 0 : $pQ = "SELECT user.ID, user.Vorname, user.Nachname, user.ShortName, user.Email FROM user LEFT OUTER JOIN user_course ON user.ID=user_course.userID WHERE ((user.usergroup=3 AND differentUsergroup=0) OR differentUsergroup=3) AND user_course.courseID=".$courseid;
511 0 : break;
512 0 : case "assistent" :
513 0 : $pQ = "SELECT user.ID, user.Vorname, user.Nachname, user.ShortName, user.Email FROM user LEFT OUTER JOIN assistents ON user.ID=assistents.userID WHERE assistents.courseID=".$courseid;
514 0 : break;
515 0 : case "student" :
516 0 : $assQ = "SELECT userID FROM assistents WHERE courseID=".$courseid;
517 0 : $ass = $db->get_col($assQ);
518 0 : $in = "";
519 0 : if($db->num_rows) {
520 0 : $in = " AND user.ID NOT IN (".implode(",", $ass).")";
521 0 : }
522 0 : $pQ = "SELECT user.ID, user.Vorname, user.Nachname, user.ShortName, user.Email FROM user LEFT OUTER JOIN user_course ON user.ID=user_course.userID WHERE ((user.Usergroup=2 AND differentUsergroup=0) OR differentUsergroup=2) AND user_course.courseID=".$courseid.$in;
523 0 : break;
524 0 : case "wait" :
525 0 : $pQ = "SELECT user.ID, user.Vorname, user.Nachname, user.ShortName, user.Email FROM user LEFT OUTER JOIN user_course_wait ON user.ID=user_course_wait.userID WHERE user_course_wait.courseID=".$courseid;
526 0 : break;
527 0 : case "all" :
528 0 : $pQ = "SELECT user.ID, user.Vorname, user.Nachname, user.ShortName, user.Email FROM user LEFT OUTER JOIN user_course ON user.ID=user_course.userID WHERE user_course.courseID=".$courseid;
529 0 : break;
530 0 : default :
531 0 : return 0;
532 0 : }
533 0 : $pQ .= " ORDER BY ".$orderBy." ".$orderDir;
534 0 : $p = $db->get_results($pQ);
535 0 : $all = array();
536 0 : if(is_array($p)) {
537 0 : foreach($p as $u) {
538 0 : $all[] = new Participant($u->ID,$u->ShortName,$u->Vorname,$u->Nachname,$u->Email);
539 0 : }
540 0 : }
541 0 : return $all;
542 : }
543 :
544 : function getPossibleAssistents($courseID) {
545 0 : global $db;
546 0 : $students = Course::getParticipants($courseID, "student");
547 0 : $all = array();
548 0 : if(is_array($students))
549 0 : foreach($students as $s)
550 0 : $all[] = $s;
551 :
552 0 : return $all;
553 : }
554 :
555 : /**
556 : * Gibt die Rolle zurueck, die Benutzer in einer Veranstaltung einnimmt.
557 : *
558 : * @access public
559 : * @static
560 : * @param integer $userid - Id des Benutzers.
561 : * @param integer $courseid - Id der Veranstaltung.
562 : * @return mixed string - Rolle des Benutzers in der Veranstaltung
563 : * moegliche Werte sind :
564 : * 'teacher' ,
565 : * 'assistent' ,
566 : * 'student' ,
567 : * 'wait'
568 : * integer 0 - falls ungueltige Parameter, oder sonstiger Fehler.
569 : */
570 : function getRole($userid, $courseid) {
571 0 : global $db;
572 :
573 0 : $isParticipantQ = "SELECT userID FROM user_course WHERE userID=".$userid." AND courseID=".$courseid;
574 0 : $isAssistentQ = "SELECT userID FROM assistents WHERE userID=".$userid." AND courseID=".$courseid;
575 0 : $isWaitingQ = "SELECT userID FROM user_course_wait WHERE courseID=".$courseid." AND userID=".$userid;
576 :
577 0 : if(!$db->get_var($isParticipantQ)) {
578 0 : $isParticipant = 0;
579 0 : } else {
580 0 : $isParticipant = 1;
581 : }
582 0 : if(!$db->get_var($isWaitingQ)) {
583 0 : $isWaiting = 0;
584 0 : } else {
585 0 : $isWaiting = 1;
586 : }
587 0 : if($isParticipant) {
588 0 : $usergroupQ = "SELECT IF(differentUsergroup>0, differentUsergroup, Usergroup) AS Usergroup FROM user LEFT JOIN user_course ON ID=userID WHERE ID=$userid AND courseID=$courseid";
589 0 : $usergroup = $db->get_var($usergroupQ);
590 0 : if(!$usergroup) {
591 0 : return 0;
592 : }
593 : switch($usergroup) {
594 0 : case 2 :
595 0 : $isAssistent = $db->get_var($isAssistentQ);
596 0 : if($isAssistent) {
597 0 : return "assistent";
598 : } else {
599 0 : return "student";
600 : }
601 0 : case 3 :
602 0 : return "teacher";
603 0 : case 4 :
604 0 : return "assistent";
605 0 : default :
606 0 : return 0;
607 0 : }
608 0 : } elseif($isWaiting) {
609 0 : return "wait";
610 : } else {
611 0 : return 0;
612 : } /* */
613 : }
614 :
615 : /**
616 : * Verleiht einem Benutzer das Tutorenrecht in einer Veranstaltung.
617 : * Studenten werden in die 'assistents'-Tabelle uebernommen. <br />
618 : * Hilfsadministratoren werden zusaetzlich in die 'user_course'-Tabelle
619 : * uebernommen.
620 : *
621 : * @access protected
622 : * @static
623 : * @param integer $userid - ID des Benutzers
624 : * @param integer $courseid - ID der Veranstaltung
625 : * @return bool - true, wenn Tutorenrecht verliehen oder Benutzer
626 : * bereits Tutor in der Veranstaltung ist
627 : * - false, wenn Datenbankfehler auftrat
628 : */
629 : function setAsAssistent($userid, $courseid) {
630 0 : global $db, $EZSQL_ERROR;
631 :
632 0 : if($userid < 0) {
633 0 : return true;
634 : }
635 :
636 0 : if($db->get_var("SELECT Usergroup FROM user WHERE ID=".$userid) == 4) {
637 0 : if(!Course::addParticipant($userid,$courseid)) {
638 0 : return false;
639 : }
640 0 : }
641 :
642 0 : if (Course::getRole($userid, $courseid) != "student") {
643 0 : return false;
644 : }
645 :
646 0 : $insertQ = "INSERT INTO assistents (userID,courseID) ";
647 0 : $insertQ .= "VALUES ('".$userid."','".$courseid."')";
648 :
649 0 : $errorCount = count($EZSQL_ERROR);
650 0 : $db->query($insertQ);
651 :
652 0 : if(count($EZSQL_ERROR) > $errorCount) {
653 0 : return false;
654 : }
655 :
656 : //----Automation-------------------------------------------------------
657 : /**zum Ausführen automatischer Funktionen*/
658 0 : require_once(PATH_TO_ROOT."common/classes/class.automation.inc.php");
659 : //neues objekt erstellen und standart logfile benutzen
660 0 : $autoAddAssistentToCourse = new Automation("");
661 0 : $autoAddAssistentToCourse->addAssistentToCourse((int)$userid ,(int)$courseid);
662 : //---------------------------------------------------------------------
663 :
664 0 : return true;
665 : }
666 :
667 : /**
668 : * Entzieht einem Benutzer das Tutorenrecht in einer Veranstaltung.
669 : * Falls der Benutzer der Benutzergruppe Hilfsadministrator angehoert,
670 : * wird er zusaetzlich aus der Veranstaltung entfernt.
671 : *
672 : * @access protected
673 : * @static
674 : * @param integer $userid - ID des Benutzers
675 : * @param integer $courseid - ID der Veranstaltung
676 : * @return bool - true, wenn Tutorenrecht entzogen wurde
677 : * false, wenn Fehler auftrat
678 : */
679 : function unsetAsAssistent($userid, $courseid) {
680 0 : global $db, $EZSQL_ERROR;
681 :
682 0 : if(Course::getRole($userid, $courseid) != "assistent") {
683 0 : return false;
684 : }
685 :
686 0 : if($db->get_var("SELECT Usergroup FROM user WHERE ID=".$userid) == 4) {
687 0 : if(!Course::removeParticipant($userid,$courseid)) {
688 0 : return false;
689 : }
690 0 : }
691 :
692 0 : $insertQ = "DELETE FROM assistents ";
693 0 : $insertQ .= "WHERE userID='".$userid."' AND courseID='".$courseid."'";
694 :
695 0 : $errorCount = count($EZSQL_ERROR);
696 0 : $db->query($insertQ);
697 :
698 0 : if(count($EZSQL_ERROR) > $errorCount) {
699 0 : return false;
700 : }
701 :
702 : //----Automation-------------------------------------------------------
703 : /**zum Ausführen automatischer Funktionen*/
704 0 : require_once(PATH_TO_ROOT."common/classes/class.automation.inc.php");
705 : //neues objekt erstellen und standart logfile benutzen
706 0 : $autoDeleteAssistentFromCourse = new Automation("");
707 0 : $autoDeleteAssistentFromCourse->deleteAssistentFromCourse((int)$userid ,(int)$courseid);
708 : //---------------------------------------------------------------------
709 :
710 0 : return true;
711 : }
712 :
713 : /**
714 : * Entzieht einem Benutzer das Dozentenrecht in einer Veranstaltung.
715 : *
716 : * @access protected
717 : * @static
718 : * @param integer $userid - ID des Benutzers
719 : * @param integer $courseid - ID der Veranstaltung
720 : * @return bool - true, wenn Dozentenrecht entzogen wurde
721 : * false, wenn Fehler auftrat
722 : */
723 : function unsetAsTeacher($userid, $courseid) {
724 0 : global $db, $EZSQL_ERROR;
725 :
726 0 : if(Course::getRole($userid, $courseid) != "teacher") {
727 0 : return false;
728 : }
729 :
730 0 : if ($db->get_var("SELECT Usergroup FROM user WHERE ID='$userid'") != STUDENT) {
731 0 : $differentUsergroup = STUDENT;
732 0 : } else {
733 0 : $differentUsergroup = 0;
734 : }
735 :
736 0 : $insertQ = "UPDATE user_course SET differentUsergroup='$differentUsergroup' ";
737 0 : $insertQ .= "WHERE userID='$userid' AND courseID='$courseid'";
738 :
739 0 : $errorCount = count($EZSQL_ERROR);
740 0 : $db->query($insertQ);
741 :
742 0 : if(count($EZSQL_ERROR) > $errorCount) {
743 0 : return false;
744 : }
745 :
746 : //----Automation-------------------------------------------------------
747 : /**zum Ausführen automatischer Funktionen*/
748 0 : require_once(PATH_TO_ROOT."common/classes/class.automation.inc.php");
749 : //neues objekt erstellen und standart logfile benutzen
750 0 : $autoDeleteAssistentFromCourse = new Automation("");
751 0 : $autoDeleteAssistentFromCourse->changeUserGroupInCourse($userid, $courseid, DOZENT, $differentUsergroup);
752 : //---------------------------------------------------------------------
753 :
754 0 : return true;
755 : }
756 :
757 : /**
758 : * Entfernt einen Benutzer aus einer Veranstaltung.
759 : *
760 : * @static
761 : * @access public
762 : * @param integer $userid - ID des Benutzers
763 : * @param integer $courseid - ID der Veranstaltung
764 : * @return integer - 1, falls Teilnehmer aus Veranstaltung entfernt wurde
765 : * 0, falls Teilnehmer nicht entfernt werden konnte.
766 : */
767 : function removeParticipant($userid, $courseid) {
768 :
769 : //----Automation-------------------------------------------------------
770 : /**zum Ausführen automatischer Funktionen*/
771 0 : require_once(PATH_TO_ROOT."common/classes/class.automation.inc.php");
772 :
773 : //neues objekt erstellen und standart logfile benutzen
774 0 : $autoDeleteUser = new Automation("");
775 0 : $autoDeleteUser->deleteUserFromCourse($userid, $courseid);
776 : //---------------------------------------------------------------------
777 :
778 : // Siehe CourseAutomation::deleteUserFromCourse()
779 :
780 0 : return true;
781 : }
782 :
783 :
784 : /**
785 : * Extrahiert Semester-Typ aus Semesterstring in Datenbankformat.
786 : *
787 : * @access public
788 : * @static
789 : * @param integer $semester - Semester in der Form "03WS"
790 : * @return string - "WS" : falls Semester Wintersemester ist;
791 : * "SS" : falls Semester Sommersemester ist.
792 : */
793 : function getSemesterType($semester) {
794 0 : return substr($semester, 2);
795 : }
796 :
797 : /**
798 : * Extrahiert das Jahr aus einem Semester.
799 : *
800 : * @access public
801 : * @static
802 : * @param integer $semester - Semester in der Form "WS 03/04" oder "SS 04"
803 : * @return string - Jahr des Semesters.
804 : */
805 : function getSemesterYear($semester) {
806 0 : $semesterYear = substr($semester, 0, 2);
807 0 : if(Course::getSemesterType($semester) == "WS") {
808 0 : $secondYear = (int) substr($semesterYear, 1, 1);
809 0 : $secondYear++;
810 0 : $semesterYear = $semesterYear."/0".$secondYear;
811 0 : }
812 0 : return $semesterYear;
813 : }
814 :
815 :
816 : /**
817 : * Wandelt Semester im Datenbankformat in normales Format um.
818 : *
819 : * @access public
820 : * @static
821 : * @param string $semester - Semester im Datenbankformat (Bsp.: "03WS")
822 : * @return string - Semester in der Form "WS 03/04" bzw. "SS 04"
823 : */
824 : function semesterDBtoString($semester) {
825 0 : $semesterType = substr($semester, 2);
826 0 : $semesterYear = substr($semester, 0, 2);
827 0 : if($semesterType === "WS") {
828 0 : $singleDigit = false;
829 0 : if(substr($semesterYear, 0, 1) === "0") {
830 0 : $singleDigit = true;
831 0 : $year2 = ((int) substr($semesterYear, 1)) + 1;
832 0 : if($year2 > 9) {
833 0 : $singleDigit = false;
834 0 : }
835 0 : }
836 0 : $semesterYear = $semesterYear."/";
837 0 : if($singleDigit === true) {
838 0 : $semesterYear = $semesterYear."0";
839 0 : }
840 0 : $semesterYear = $semesterYear.$year2;
841 0 : }
842 0 : return $semesterType." ".$semesterYear;
843 : }
844 :
845 : /**
846 : * Wandelt Semester in normalem Format in Datenbankformat um.
847 : *
848 : * @access public
849 : * @static
850 : * @param string $semester - Semester in der Form "WS 03/04" bzw. "SS 04"
851 : * @return string - Semester in Datenbankformat z.B. "03WS" , "03SS"
852 : */
853 : function semesterStringToDB($semester) {
854 0 : $year = substr($semester, 3, 2);
855 0 : $type = substr($semester, 0, 2);
856 0 : return $year.$type;
857 : }
858 :
859 : public static function getCheckOutNotice( $id ) {
860 0 : global $db;
861 :
862 0 : $courseId = Data::toMysql( $id, false );
863 0 : $sql = "SELECT CheckOutNotice FROM courses WHERE ID = '$courseId'";
864 0 : return $db->get_var( $sql );
865 : }
866 :
867 : public static function setCheckOutNotice( $value ) {
868 0 : global $db;
869 :
870 0 : $courseId = Data::toMysql( $_SESSION['course'], false );
871 0 : $value = Data::toMysql( $value, false );
872 0 : $sql = "UPDATE courses SET CheckOutNotice = '$value' WHERE ID = '$courseId'";
873 0 : $db->query( $sql );
874 0 : }
875 : }
876 : ?>
|